package com.gxa.uhome.aspect;

import com.gxa.uhome.exception.SystemException;
import com.gxa.uhome.util.JsonResult;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Arrays;

//通过@Component将bean注册到Spring容器里
@Component
//声明当前bean为一个切面
@Aspect
@ControllerAdvice
public class LogAspect {

    //确定切点: 为所有Service的实现类中的任意方法
    //* com.gxa.ssm251.service.impl.*.*(..)
    // 第一个*: 表示任意访问权限
    // com.gxa.ssm251.service.impl 表示类的全路径
    // 第二个*: 任意类
    // 第三个*: 任意方法
    // (..): 表示任意类型任意数量的参数情况

    //配置一个切点Pointcut

    @Pointcut(value = "execution(* com.gxa.uhome.service.impl.*.*(..))")
    public void pointcut() {
    }


    // 前置通知
    @Before(value = "pointcut()")
    public void beforeAdvice(JoinPoint joinPoint) {
        //获取方法名
        String name = joinPoint.getSignature().getName();
        System.out.println("args:" + Arrays.toString(joinPoint.getArgs()));
        System.out.println("前置通知");
    }

    // 后置返回通知
    @AfterReturning(value = "pointcut()", returning = "result")
    public void afterReturning(Object result) {
        System.out.println("后置返回通知");
    }

    // 后置抛出通知
    @AfterThrowing(value = "pointcut()", throwing = "e")
    @ResponseBody
    public void afterThrowing(SystemException e) {
        System.out.println("后置抛出通知");
    }

    // 后置通知
    @After(value = "pointcut()")
    public void afterAdvice() {
        System.out.println("后置通知");
    }
    // 环绕通知:
   /* @Around(value = "pointcut()")
    public void around(ProceedingJoinPoint proceedingJoinPoint){

        try {
            System.out.println("前置通知");
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("后置返回通知");
        } catch (Throwable throwable) {
            System.out.println("后置抛出通知");
        }
        System.out.println("后置通知");
    }*/
}
